﻿#ifndef MODBUS_H
#define MODBUS_H
/***********************************************
1.Qt中几个常用的Modbus类
QModbusRtuSerialSlave // 从站，RTU模式下的服务器类
QModbusRtuSerialMaster // 主站，RTU模式下的客户端类
QModbusClient // 客户端
QModbusServer // 服务器
QModbusRequest // 请求
QModbusResponse // 应答
QModbusReply // 回答
QModbusDataUnit // 存储接收和发送的数据，数据类型为1bit和16bit

2.ModbusMaster发送数据代码流程
(1)创建QModbusClient的对象*pModbusClient
(2)将pModbusClient的值赋值为QModbusRtuSerialMaster类型的对象
(3)设置pModbusClient的串口参数（如COM号、波特率…）
(4)利用QModbusDevice类中的方法connectDevice()连接Modbus网络
(5)创建QModbusDataUnit的数据单元
(6)调用QModbusDataUnit中的方法setValue()装载数据
(7)调用QModbusClient的方法sendWriteRequest()发送数据
(8)根据方法sendWriteRequest()的返回值判断发送是否成功
本例子用的是主站
*/

#include <QObject>
#include <QModbusDataUnit>
#include <QModbusRtuSerialMaster>
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QDebug>
#include <QEventLoop>
#include "main/message.h"
#define QDEBUG debugMessage::instance()->sendMessage

class Modbus : public QObject
{
    Q_OBJECT

public:
    Modbus();
    bool connectToSlave(QString port, int baud);
    void executeReadRequest(int RegisterType, int regAdress, int size, QVector<quint16> *values);
    void executeWriteRequest(int RegisterType, int regAdress, QVector<quint16>values);
    bool isConnect();
    bool disconnectToSlave();
    bool getCoisValue(QVector<quint16> *value);
    enum RegType { DiscreteInputs = 1, Coils = 2, InputRegisters = 3, HoldingRegisters = 4 };

private:
    QModbusReply *modbusReply;
    QModbusClient *modbusMaster;
    QEventLoop loop;
    QModbusDataUnit prepareRequest(int regAdress, int regType);
    QModbusDataUnit prepareWriteRequest(int regAdress, int regType);
signals:
    void coisValue(bool);

private slots:
    void readReady();
    void writeRequestFinished();
private:
    QVector<quint16> m_coisValue;

};

#endif // MODBUS_H
